package apis

import (
	"gitee.com/sansaniot/ssiot-core/httpmvc/api"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"ssdevice/internal/device/models"
	"ssdevice/internal/device/models/command"
	"ssdevice/internal/device/models/query"
	"ssdevice/internal/device/service"
)

type Product struct {
	api.Api
}

// 查询产品列表
func (e Product) FindList(c *gin.Context) {
	// 请求参数
	req := query.SysProductQuery{}
	// 模型
	m := models.SysDevProduct{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindProductList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 查询产品
func (e Product) FindOne(c *gin.Context) {
	// 请求参数
	req := query.SysProductQuery{}
	// 模型
	m := models.SysDevProduct{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindProduct(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(result)
}

// 添加产品
func (e Product) AddProduct(c *gin.Context) {
	// 请求参数
	req := command.ProductInsertReq{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result models.SysDevProduct
	if err, result = s.AddProduct(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 编辑产品(基本信息)
func (e Product) EditProduct(c *gin.Context) {
	// 请求参数
	req := command.ProductEditReq{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.EditProduct(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 删除产品
func (e Product) DeleteProduct(c *gin.Context) {
	// 请求参数
	req := command.ProductDeleteReq{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.DeleteProduct(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 产品复制
func (e Product) ProductCopy(c *gin.Context) {
	// 请求参数
	req := command.ProductCopyReq{}
	// 业务service
	s := &service.Product{}
	// 模型
	devProduct := &models.SysDevProduct{}
	devSensor := &models.SysDevSensor{}
	devConfig := &models.SysDevConfig{}
	devFunc := &models.SysDevFunc{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&devProduct.Model,
			&devSensor.Model,
			&devConfig.Model,
			&devFunc.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetProductModel(devProduct).SetSensorModel(devSensor).SetConfigModel(devConfig).SetFuncModel(devFunc)
	// 用户信息
	req.LoadUser(c)
	// 执行
	var result models.SysDevProduct
	if result, err = s.ProductCopy(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Data(result)
}

// 产品设备同步更新
func (e Product) ProductDevSync(c *gin.Context) {
	// 请求参数
	req := command.ProductDevSyncReq{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetAllModel()
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.ProductDevSync(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 产品导出
func (e Product) ExportProduct(c *gin.Context) {
	req := query.SysProductQuery{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeService(&s.Service).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 注入模型
	s.SetAllModel()
	// 执行
	req.LoadUser(c)
	err = s.ExportProduct(c, &req)
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	c.Abort()
}

// 产品导入
func (e Product) ImportProduct(c *gin.Context) {
	req := query.SysProductQuery{}
	// 业务service
	s := &service.Product{}
	// 上下文
	err := e.MakeContext(c).Bind(&req, binding.FormMultipart).MakeService(&s.Service).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 注入模型
	s.SetAllModel()
	// 执行
	req.LoadUser(c)
	err = s.ImportProduct(c, &req)
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}

// 配置整体操作
func (e Product) UpsertEntireConfig(c *gin.Context) {
	// 请求参数
	req := command.ProductDeviceConfigReq{}
	// 业务service
	s := &service.Product{}
	// 模型
	dev := &models.SysDev{}
	devConfig := &models.SysDevConfig{}
	productModel := &models.SysDevProduct{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeModel(&dev.Model,
			&devConfig.Model,
			&productModel.Model,
		).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// service注入实体
	s.SetDevModel(dev).SetConfigModel(devConfig).SetProductModel(productModel)
	// 用户信息
	req.LoadUser(c)
	// 执行
	if err = s.UpsertEntireConfig(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 返回
	e.Ok(nil)
}
